﻿using System;
using System.Collections.Generic;
//using System.Linq;
using System.Text;
using System.Xml.Serialization;

namespace Xuhengxiao.MediaConverter
{
    /// <summary>
    /// 这个类是保存调用命令行时的参数。也包含一个生成命令行参数的方法。
    /// </summary>
    /// 
    [Serializable]
    public   class clsParameter
    {
        //
        /// <summary>
        /// 配置名称
        /// </summary>
        public string ParameterName { get; set; }

        //格式
        /// <summary>
        /// 格式
        /// </summary>
        public string  FormatName { get; set; }

        //如下是判断是否剪裁
        //如下是开始时间结束时间
        /// <summary>
        /// 是否剪裁
        /// </summary>
        [XmlIgnore]
        public bool isCut { get; set; }
        /// <summary>
        /// 开始时间
        /// </summary>
        [XmlIgnore]
        public string SSPosition { get; set; }
        /// <summary>
        /// 录制时间
        /// </summary>
        [XmlIgnore]
        public string TDuration { get; set; }

        //below is Audio
        //如下是音频参数
        /// <summary>
        /// 音频码率
        /// audio bit rate
        /// </summary>
        public string AbBitRate { get; set; }
        /// <summary>
        /// 音频采集率
        /// audio freq
        /// </summary>
        public string ArFreq { get; set; }
        /// <summary>
        /// 音频通道
        /// audio channels
        /// </summary>
        public string AcChannels { get; set; }
        /// <summary>
        /// 音频编码
        /// audio codec
        /// </summary>
        public string  AcCodecCodec { get; set; }
        /// <summary>
        /// 是否记录音频
        /// is audio
        /// </summary>
        public bool isAC { get; set; }


        //Below is Video
        //如下是视频参数
        /// <summary>
        /// Video bit Rate
        /// </summary>
        public string BBitRate { get; set; }
        /// <summary>
        /// 帧频
        /// </summary>
        public string RFps { get; set; }
        /// <summary>
        /// 分辨率
        /// </summary>
        public string SSzie { get; set; }
        /// <summary>
        /// 横纵比
        /// </summary>
        public string AsPect { get; set; }
        /// <summary>
        /// 视频码率容忍度
        /// </summary>
        public string BtTolerance { get; set; }
        /// <summary>
        /// 最大视频码率容忍度
        /// </summary>
        public string MaxrateBitrate { get; set; }
        /// <summary>
        /// 最小视频码率容忍度
        /// </summary>
        public string  MinrateBitrate { get; set; }
        /// <summary>
        /// 码率缓冲区大小
        /// </summary>
        public string  BufSize { get; set; }
        /// <summary>
        /// 视频编码
        /// </summary>
        public string  VCodecCodec { get; set; }
        /// <summary>
        /// 使用同样视频质量作为源
        /// </summary>
        public bool isSameq { get; set; }
        /// <summary>
        /// 是否记录视频
        /// </summary>
        public bool isVn { get; set; }

        /// <summary>
        /// 源文件
        /// </summary>
        [XmlIgnore]
        public string  sourcePath { get; set; }

        /// <summary>
        /// 是否使用同样的视频源
        /// </summary>
        public bool sameQ { get; set; }
        /// <summary>
        /// 转换后保存的文件，如果这个为空，就表示跟源文件一个目录
        /// </summary>
        [XmlIgnore]
        public string  destPath { get; set; }

        /// <summary>
        /// 生成命令行参数
        /// </summary>
        /// <returns></returns>
        public string createParameter()
        {
            string strReturn = "";//这个是命令行参数，作为返回值

            //加上文件名
            strReturn += " -i " + "\"" + sourcePath + "\"";

            //加上格式
            strReturn += " -f " + FormatName.ToLower() + " ";

            //如果剪裁
            if (isCut)
            {
                if((SSPosition!=null) &&(SSPosition!=string.Empty))
                {
                    strReturn += " -ss " + SSPosition;

                }
                if ((TDuration != null) && (TDuration != string.Empty))
                {
                    strReturn += " -t " + SSPosition;

                }

            }
            //如果有音频
            if (isAC)
            {
                strReturn += fun1("-ab", AbBitRate);
                strReturn += fun1("-ar", ArFreq);
                strReturn += fun1("-ac", AcChannels);
                strReturn += fun1("-acodec ", AcCodecCodec);
            }
            //如果有视频
            if (isVn)
            {
                //如果使用同样视频质量
                if (sameQ)
                {
                    strReturn += " -sameq ";
                }
                else
                {
                    strReturn += fun1("-b", BBitRate);
                    strReturn += fun1("-r", RFps);
                    strReturn += fun1("-s", SSzie);
                    strReturn += fun1("-aspect ", AsPect);
                    strReturn += fun1("-bt", BtTolerance);
                    strReturn += fun1("-maxrate", MaxrateBitrate);
                    strReturn += fun1("-minrate", MinrateBitrate);
                    strReturn += fun1("-bufsize", BufSize);
                    strReturn += fun1("-vcodec", VCodecCodec);

                }

            }

            //加上目的目录
            strReturn += " \"" + destPath + "\" ";

            return strReturn;

        }
        /// <summary>
        /// 这个方法就是判断str2是否为空，如果不为空就组合成
        /// </summary>
        /// <param name="str1"></param>
        /// <param name="str2"></param>
        /// <returns></returns>
        private string fun1(string str1, string str2)
        {
            string str = string.Empty;
            //如果不是空或者自动
            if ((str2!=string.Empty)&&(str2.ToUpper()!="auto".ToUpper()))
            {
                return " "+ str1 + " " + str2 + " "; 
            }

            return str;

        }



        /// <summary>
        /// 这个以后扩展成可以合并多个媒体文件的，里边保存的是每个源文件和开始结束时间。其他配置由本对象提供。
        /// </summary>
        /// <param name="arrParameters"></param>
        /// <returns></returns>
        public string createParameter(clsParameter [] arrParameters)
        {
            string strReturn = "";//这个是命令行参数，作为返回值


            return strReturn;

        }

    }
}
